#ifndef LOG_H__
#define LOG_H__

#include <stdbool.h>
#include <stdint.h>
#include <stdarg.h>

#define log_fatal(...) log_print(LOG_FATAL, __BASE_FILE__, __LINE__, __VA_ARGS__)
#define log_error(...) log_print(LOG_ERROR, __BASE_FILE__, __LINE__, __VA_ARGS__)
#define log_warning(...) log_print(LOG_WARNING, __BASE_FILE__, __LINE__, __VA_ARGS__)
#define log_info(...) log_print(LOG_INFO, __BASE_FILE__, __LINE__, __VA_ARGS__)
#define log_debug(...) log_print(LOG_DEBUG, __BASE_FILE__, __LINE__, __VA_ARGS__)
#define log_trace(...) log_print(LOG_TRACE, __BASE_FILE__, __LINE__, __VA_ARGS__)

#define USE_PTHREAD_MUTEX

typedef enum {
    LOG_FATAL = 0,
    LOG_ERROR,
    LOG_WARNING,
    LOG_INFO,
    LOG_DEBUG,
    LOG_TRACE
}log_level_t;

typedef const char* (*log_timeshift_fp)();
typedef void* (*callback_fp)(void *data);
typedef void (*log_lock_fp)(bool lock, void *data);

void log_print(int level, const char *file, int line, const char *fmt, ...);

void log_set_file_size(uint32_t size);
int log_set_file(char *name);
void log_set_color(bool color);
void log_set_call(bool call);
void log_set_level(log_level_t level);
void log_set_callback(callback_fp cb, void *data);
void log_set_lock(log_lock_fp lock, void *data);

#endif
